# Copyright (C) 2026. Logiciel élaboré par l'État, via le DEPS.
# Nom des auteures : Flore Cornuet et Camille Parent, DEPS.
# Ce programme informatique a été développé par le DEPS.
# Il permet de produire les résultats du Culture Études 1-2026.

# Ce programme a été exécuté en septembre 2026 avec la version 4.5.3 de R.
# La publication peut être consultée sur le site du Deps. 
# Ce programme utilise les données du pass Culture et du recensement de la population 2022.

# Bien qu'il n'existe aucune obligation légale à ce sujet, les utilisateurs de ce programme sont
# invités à signaler au DEPS leurs travaux issus de la réutilisation de ce code, ainsi que les
# éventuels problèmes ou anomalies qu'ils y rencontreraient, en écrivant à contact.deps@culture.gouv.fr .
# Ce logiciel est régi par la licence EUPL V1.2 soumise au droit français et européen, respectant
# les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer
# ce programme sous les conditions de la licence EUPL V1.2, telle que diffusée sur
# https://eupl.eu/1.2/fr/ .
# En contrepartie de l'accessibilité au code source et des droits de copie, de modification et de
# redistribution accordés par cette licence, il n'est offert aux utilisateurs qu'une garantie
# limitée. Pour les mêmes raisons, seule une responsabilité restreinte pèse sur les auteures du
# programme, le titulaire des droits patrimoniaux et les concédants successifs.
# À cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à
# l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par
# l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à
# manipuler et qui le réserve donc à des développeurs et des professionnels avertis possédant des
# connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester
# l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de
# leurs systèmes et ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les
# mêmes conditions de sécurité.


# téléchargement des packages ####

library(arrow); library(duckdb); library(DBI); library(glue)
library(data.table); library(tidyverse)

# création de la connexion duckdb ####

con <- dbConnect(duckdb())
dbExecute(con, "SET threads = 4")
dbExecute(con, "SET preserve_insertion_order = false")
dbExecute(con, "SET memory_limit = '16GB'")

# population RP à l'année des 18 ans de chaque cohorte
pop_rp <- read.csv(chemin_pop)
setDT(pop_rp)

rp_denom <- c(
  "2003" = pop_rp[annee == 2021 & annee_naissance == 2003, sum(pop_dep)],
  "2004" = pop_rp[annee == 2022 & annee_naissance == 2004, sum(pop_dep)],
  "2005" = pop_rp[annee == 2023 & annee_naissance == 2005, sum(pop_dep)]
)
rp_0305 <- sum(rp_denom)

# === numérateurs : un flag par type de chèque et par user ===
base <- dbGetQuery(con, glue("
  WITH cheques AS (
    SELECT u.user_id,
           EXTRACT(YEAR FROM u.user_birth_date) AS annee_naissance,
           MAX(CASE WHEN d.deposit_amount = 300  THEN 1 ELSE 0 END) AS a_300,
           MAX(CASE WHEN d.deposit_amount != 300 THEN 1 ELSE 0 END) AS a_autre
    FROM read_parquet('{chemin_deposit}') d
    JOIN read_parquet('{chemin_user}') u ON d.user_id = u.user_id
    WHERE d.deposit_creation_date >= '2021-05-21'
      AND d.deposit_creation_date <  '2025-02-28'
      AND EXTRACT(YEAR FROM u.user_birth_date) BETWEEN 2003 AND 2005
    GROUP BY u.user_id, annee_naissance
  )
  SELECT
    annee_naissance,
    COUNT(DISTINCT user_id)                                            AS n_au_moins_un,
    COUNT(DISTINCT CASE WHEN a_300 = 1 THEN user_id END)              AS n_300,
    COUNT(DISTINCT CASE WHEN a_300 = 1 AND a_autre = 1 THEN user_id END) AS n_300_et_autre,
    COUNT(DISTINCT CASE WHEN a_300 = 0 AND a_autre = 1 THEN user_id END) AS n_autre_seul
  FROM cheques
  GROUP BY annee_naissance
  ORDER BY annee_naissance
"))
setDT(base)
base[, rp := rp_denom[as.character(annee_naissance)]]

# === agrégat 2003-2005 ===
tot <- base[, .(annee_naissance = "2003-2005",
                n_au_moins_un  = sum(n_au_moins_un),
                n_300          = sum(n_300),
                n_300_et_autre = sum(n_300_et_autre),
                n_autre_seul   = sum(n_autre_seul),
                rp             = rp_0305)]

base_all <- rbind(base[, annee_naissance := as.character(annee_naissance)], tot)

# === les 4 lignes du tableau (en %) ===
base_all[, ':='(
  l1_au_moins_un = round(n_au_moins_un  / rp * 100),  # au moins un chèque
  l2_300         = round(n_300          / rp * 100,1),  # chèque 300
  l3_300_et_autre = round(n_300_et_autre / rp * 100), # 300 ET <18 ans
  l4_autre_seul  = round(n_autre_seul   / rp * 100)   # uniquement <18 ans
)]

# mise en forme façon tableau
tableau <- base_all[, .(annee_naissance,
                        l1_au_moins_un, l2_300, l3_300_et_autre, l4_autre_seul)]
tableau <- dcast(melt(tableau, id.vars = "annee_naissance"),
                 variable ~ annee_naissance, value.var = "value")

tableau[, libelle := c(
  "Taux de recours au chèque de 300€ et/ou à un chèque <18 ans",
  "Taux de recours au chèque de 300€",
  "Part des jeunes ayant eu le chèque 300€ et un chèque <18 ans",
  "Part des jeunes ayant eu accès uniquement à des chèques <18 ans"
)]
setcolorder(tableau, c("libelle", "2003", "2004", "2005", "2003-2005"))
tableau[, variable := NULL]

tableau
